import datetime

from flask import current_app, jsonify
from flask import make_response
from flask import request
import re ,random

from flask import session

from Info.constants import IMAGE_CODE_REDIS_EXPIRES, SMS_CODE_REDIS_EXPIRES
from Info.models import User
from Info.modules.passport import passport_blu
from Info.utils.captcha.captcha import captcha
from Info.utils.response_code import RET
from Info import redis_store, db

# 登陆退出页面
@passport_blu.route('/logout',methods=['POST'])
def logout():
    session.pop('user_id')
    session.pop('mobile')
    session.pop('nick_name')
    return jsonify(errno=RET.OK,errmsg='成功退出')
# 登陆页面路由
@passport_blu.route('/login',methods=['POST'])
def login():
    # 获取前端数据
    req_dic = request.json
    mobile  = req_dic['mobile']
    password  = req_dic['password']

    # 判断数据书否合法
    if re.match(r'^1[3-9]d{9}$]', mobile):
        return jsonify(errno=RET.DATAERR,errmsg='手机格式有误')

    # 判读用户是否存在
    user = User.query.filter(User.mobile == mobile).first()
    if not user:
        return jsonify(errno=RET.DATAEXIST,errmsg='该用户不存在')

    # 验证用户登陆密码
    if not user.check_passowrd(password):
        return jsonify(errno=RET.PWDERR,errmsg='用户密码错误')

    # 记录登陆状态
    session['user_id']=user.id
    session['mobile']=user.mobile
    session['nick_name']=user.nick_name
    # user.last_login = datetime.now()
    # db.session.commit()
    # 检查密码是否正确
    return jsonify(errno=RET.OK,errmsg='登陆成功')

#注册后端实现
@passport_blu.route('/register',methods=['POST'])
def register():
    # 1.获取参数和判断是否有值
    req_dic = request.json
    mobile = req_dic['mobile']
    smscode = req_dic['smscode']
    password = req_dic['password']
    # 判断输入参数是否有值
    if not all([mobile,smscode,password]):
        return jsonify(errno=RET.NODATA,errmsg='输入数据不能为空')

    # 2.从redis中获取指定手机号对应的短信验证码的， 并验证是否与输入一致
    redis_smscode = redis_store.get('sms_code:%s' % mobile)
    if smscode != redis_smscode:
        return jsonify(errno=RET.DATAERR,errmsg='输入手机验证码不正确')

    # 4.初始化user模型，并设置数据并添加到数据库
    user = User()

    if User.query.filter(User.mobile==mobile).first():
        return jsonify(errno=RET.DATAEXIST,errmsg='该手机用户已经注册过')

    user.mobile = mobile
    user.nick_name = mobile
    user.password = password

    # 5.保存当前用户的状态
    session['mobile'] = mobile
    session['nick_name'] = mobile
    session['password'] = password
    db.session.add(user)
    db.session.commit()
    # 6. 返回注册的结果
    return jsonify(errno=RET.OK,errmsg='注册成功')

# 创建一个路由发送短信验证码
@passport_blu.route('/sms_code',methods=['POST'])
def sms_code():
   # 1.获取手机号，图片验证码数据
   request_dic = request.json
   mobile = request_dic['mobile']
   image_code = request_dic['image_code']
   # 图片真是实ｉｄ
   image_code_id = request_dic['image_code_id']

   # 判断手机，验证码，
   if not  all([mobile,image_code,image_code_id]):
      return jsonify(errno=RET.PARAMERR, errmsg='缺少参数')

   # 2.验证码手机号是否合法
   if re.match(r'^1[3-9]d{9}$]',mobile):
      return jsonify(errno=RET.DATAERR,errmsg='手机格式错误')

   # 3.图片验证码是否过期以及是否与ｒｅｄｉｓ中的相等
   result_image_code_id = redis_store.get('ImageCode_:%s'%image_code_id)

   if not image_code_id :
      return jsonify(errno=RET.NODATA, errmsg='图片验证码已过期')

   elif result_image_code_id.upper() != image_code.upper():
       return jsonify(errno=RET.NODATA, errmsg='输入图片验证码不正确或者已过期')

   # 3.生成手机验证码并保存到ｒｅｄｉｓ
   sms_randid = ('%04d') %random.randint(0,9999)
   print('手机验证码',sms_randid)
   # 4.利用云通讯将验证码发送到手机
   # res = CCP().send_template_sms(mobile, [sms_randid, SMS_CODE_REDIS_EXPIRES], 1)
   # if res != 0:
   #     print('发送失败')
   #     return jsonify(errno=RET.DATAERR, errmsg='手机验证码发送失败')
   redis_store.set('sms_code:%s' % mobile,sms_randid,SMS_CODE_REDIS_EXPIRES)
   return jsonify(errno=RET.OK, errmsg='手机验证码发送成功')


# 创建路由显示图片验证码
@passport_blu.route('/image_code')
def get_image_code():
   # 1. 获取到当前的图片编号id
   image_code_id = request.args.get('image_code_id')
   if not image_code_id :
      return jsonify(errno=RET.DATAERR,errmsg='随机参数有误')
   # 2. 生成验证码
   name,text,image = captcha.generate_captcha()

   try:
      # 保存当前生成的图片验证码内容
      redis_store.set('ImageCode_:%s'%image_code_id,text,IMAGE_CODE_REDIS_EXPIRES)
   except Exception as e:
      current_app.logger.error(e)
      return jsonify(errno=RET.DATAERR, errmsg='保存图片验证码失败')

   # 返回响应内容
   resp = make_response(image)
   # 设置内容类型
   resp.headers['Content-Type'] = 'image/jpg'
   return resp

